/**
 *
 * Date picker
 * Author: Stefan Petre www.eyecon.ro
 * 
 * Dual licensed under the MIT and GPL licenses
 * 
 */
(function ($) {
	var DatePicker = function () {
		var	ids = {},
			views = {
				years: 'datepickerViewYears',
				moths: 'datepickerViewMonths',
				days: 'datepickerViewDays'
			},
			tpl = {
				wrapper: '<div class="datepicker"><div class="datepickerBorderT" /><div class="datepickerBorderB" /><div class="datepickerBorderL" /><div class="datepickerBorderR" /><div class="datepickerBorderTL" /><div class="datepickerBorderTR" /><div class="datepickerBorderBL" /><div class="datepickerBorderBR" /><div class="datepickerContainer"><table cellspacing="0" cellpadding="0"><tbody><tr></tr></tbody></table></div></div>',
				head: [
					'<td>',
					'<table cellspacing="0" cellpadding="0">',
						'<thead>',
							'<tr>',
								'<th class="datepickerGoPrev"><a href="#"><span><%=prev%></span></a></th>',
								'<th colspan="6" class="datepickerMonth"><a href="#"><span></span></a></th>',
								'<th class="datepickerGoNext"><a href="#"><span><%=next%></span></a></th>',
							'</tr>',
							'<tr class="datepickerDoW">',
								'<th><span><%=week%></span></th>',
								'<th><span><%=day1%></span></th>',
								'<th><span><%=day2%></span></th>',
								'<th><span><%=day3%></span></th>',
								'<th><span><%=day4%></span></th>',
								'<th><span><%=day5%></span></th>',
								'<th><span><%=day6%></span></th>',
								'<th><span><%=day7%></span></th>',
							'</tr>',
						'</thead>',
					'</table></td>'
				],
				space : '<td class="datepickerSpace"><div></div></td>',
				days: [
					'<tbody class="datepickerDays">',
						'<tr>',
							'<th class="datepickerWeek"><a href="#"><span><%=weeks[0].week%></span></a></th>',
							'<td class="<%=weeks[0].days[0].classname%>"><a href="#"><span><%=weeks[0].days[0].text%></span></a></td>',
							'<td class="<%=weeks[0].days[1].classname%>"><a href="#"><span><%=weeks[0].days[1].text%></span></a></td>',
							'<td class="<%=weeks[0].days[2].classname%>"><a href="#"><span><%=weeks[0].days[2].text%></span></a></td>',
							'<td class="<%=weeks[0].days[3].classname%>"><a href="#"><span><%=weeks[0].days[3].text%></span></a></td>',
							'<td class="<%=weeks[0].days[4].classname%>"><a href="#"><span><%=weeks[0].days[4].text%></span></a></td>',
							'<td class="<%=weeks[0].days[5].classname%>"><a href="#"><span><%=weeks[0].days[5].text%></span></a></td>',
							'<td class="<%=weeks[0].days[6].classname%>"><a href="#"><span><%=weeks[0].days[6].text%></span></a></td>',
						'</tr>',
						'<tr>',
							'<th class="datepickerWeek"><a href="#"><span><%=weeks[1].week%></span></a></th>',
							'<td class="<%=weeks[1].days[0].classname%>"><a href="#"><span><%=weeks[1].days[0].text%></span></a></td>',
							'<td class="<%=weeks[1].days[1].classname%>"><a href="#"><span><%=weeks[1].days[1].text%></span></a></td>',
							'<td class="<%=weeks[1].days[2].classname%>"><a href="#"><span><%=weeks[1].days[2].text%></span></a></td>',
							'<td class="<%=weeks[1].days[3].classname%>"><a href="#"><span><%=weeks[1].days[3].text%></span></a></td>',
							'<td class="<%=weeks[1].days[4].classname%>"><a href="#"><span><%=weeks[1].days[4].text%></span></a></td>',
							'<td class="<%=weeks[1].days[5].classname%>"><a href="#"><span><%=weeks[1].days[5].text%></span></a></td>',
							'<td class="<%=weeks[1].days[6].classname%>"><a href="#"><span><%=weeks[1].days[6].text%></span></a></td>',
						'</tr>',
						'<tr>',
							'<th class="datepickerWeek"><a href="#"><span><%=weeks[2].week%></span></a></th>',
							'<td class="<%=weeks[2].days[0].classname%>"><a href="#"><span><%=weeks[2].days[0].text%></span></a></td>',
							'<td class="<%=weeks[2].days[1].classname%>"><a href="#"><span><%=weeks[2].days[1].text%></span></a></td>',
							'<td class="<%=weeks[2].days[2].classname%>"><a href="#"><span><%=weeks[2].days[2].text%></span></a></td>',
							'<td class="<%=weeks[2].days[3].classname%>"><a href="#"><span><%=weeks[2].days[3].text%></span></a></td>',
							'<td class="<%=weeks[2].days[4].classname%>"><a href="#"><span><%=weeks[2].days[4].text%></span></a></td>',
							'<td class="<%=weeks[2].days[5].classname%>"><a href="#"><span><%=weeks[2].days[5].text%></span></a></td>',
							'<td class="<%=weeks[2].days[6].classname%>"><a href="#"><span><%=weeks[2].days[6].text%></span></a></td>',
						'</tr>',
						'<tr>',
							'<th class="datepickerWeek"><a href="#"><span><%=weeks[3].week%></span></a></th>',
							'<td class="<%=weeks[3].days[0].classname%>"><a href="#"><span><%=weeks[3].days[0].text%></span></a></td>',
							'<td class="<%=weeks[3].days[1].classname%>"><a href="#"><span><%=weeks[3].days[1].text%></span></a></td>',
							'<td class="<%=weeks[3].days[2].classname%>"><a href="#"><span><%=weeks[3].days[2].text%></span></a></td>',
							'<td class="<%=weeks[3].days[3].classname%>"><a href="#"><span><%=weeks[3].days[3].text%></span></a></td>',
							'<td class="<%=weeks[3].days[4].classname%>"><a href="#"><span><%=weeks[3].days[4].text%></span></a></td>',
							'<td class="<%=weeks[3].days[5].classname%>"><a href="#"><span><%=weeks[3].days[5].text%></span></a></td>',
							'<td class="<%=weeks[3].days[6].classname%>"><a href="#"><span><%=weeks[3].days[6].text%></span></a></td>',
						'</tr>',
						'<tr>',
							'<th class="datepickerWeek"><a href="#"><span><%=weeks[4].week%></span></a></th>',
							'<td class="<%=weeks[4].days[0].classname%>"><a href="#"><span><%=weeks[4].days[0].text%></span></a></td>',
							'<td class="<%=weeks[4].days[1].classname%>"><a href="#"><span><%=weeks[4].days[1].text%></span></a></td>',
							'<td class="<%=weeks[4].days[2].classname%>"><a href="#"><span><%=weeks[4].days[2].text%></span></a></td>',
							'<td class="<%=weeks[4].days[3].classname%>"><a href="#"><span><%=weeks[4].days[3].text%></span></a></td>',
							'<td class="<%=weeks[4].days[4].classname%>"><a href="#"><span><%=weeks[4].days[4].text%></span></a></td>',
							'<td class="<%=weeks[4].days[5].classname%>"><a href="#"><span><%=weeks[4].days[5].text%></span></a></td>',
							'<td class="<%=weeks[4].days[6].classname%>"><a href="#"><span><%=weeks[4].days[6].text%></span></a></td>',
						'</tr>',
						'<tr>',
							'<th class="datepickerWeek"><a href="#"><span><%=weeks[5].week%></span></a></th>',
							'<td class="<%=weeks[5].days[0].classname%>"><a href="#"><span><%=weeks[5].days[0].text%></span></a></td>',
							'<td class="<%=weeks[5].days[1].classname%>"><a href="#"><span><%=weeks[5].days[1].text%></span></a></td>',
							'<td class="<%=weeks[5].days[2].classname%>"><a href="#"><span><%=weeks[5].days[2].text%></span></a></td>',
							'<td class="<%=weeks[5].days[3].classname%>"><a href="#"><span><%=weeks[5].days[3].text%></span></a></td>',
							'<td class="<%=weeks[5].days[4].classname%>"><a href="#"><span><%=weeks[5].days[4].text%></span></a></td>',
							'<td class="<%=weeks[5].days[5].classname%>"><a href="#"><span><%=weeks[5].days[5].text%></span></a></td>',
							'<td class="<%=weeks[5].days[6].classname%>"><a href="#"><span><%=weeks[5].days[6].text%></span></a></td>',
						'</tr>',
					'</tbody>'
				],
				months: [
					'<tbody class="<%=className%>">',
						'<tr>',
							'<td colspan="2"><a href="#"><span><%=data[0]%></span></a></td>',
							'<td colspan="2"><a href="#"><span><%=data[1]%></span></a></td>',
							'<td colspan="2"><a href="#"><span><%=data[2]%></span></a></td>',
							'<td colspan="2"><a href="#"><span><%=data[3]%></span></a></td>',
						'</tr>',
						'<tr>',
							'<td colspan="2"><a href="#"><span><%=data[4]%></span></a></td>',
							'<td colspan="2"><a href="#"><span><%=data[5]%></span></a></td>',
							'<td colspan="2"><a href="#"><span><%=data[6]%></span></a></td>',
							'<td colspan="2"><a href="#"><span><%=data[7]%></span></a></td>',
						'</tr>',
						'<tr>',
							'<td colspan="2"><a href="#"><span><%=data[8]%></span></a></td>',
							'<td colspan="2"><a href="#"><span><%=data[9]%></span></a></td>',
							'<td colspan="2"><a href="#"><span><%=data[10]%></span></a></td>',
							'<td colspan="2"><a href="#"><span><%=data[11]%></span></a></td>',
						'</tr>',
					'</tbody>'
				]
			},
			defaults = {
				flat: false,
				starts: 1,
				prev: '&#9664;',
				next: '&#9654;',
				lastSel: false,
				mode: 'single',
				view: 'days',
				calendars: 1,
				format: 'Y-m-d',
				position: 'bottom',
				eventName: 'click',
				onRender: function(){return {};},
				onChange: function(){return true;},
				onShow: function(){return true;},
				onBeforeShow: function(){return true;},
				onHide: function(){return true;},
				locale: {
					days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
					daysShort: ["日", "一", "二", "三", "四", "五", "六", "日"],
					daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"],
					months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
					monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
					weekMin: '周'
				}
			},
			fill = function(el) {
				var options = $(el).data('datepicker');
				var cal = $(el);
				var currentCal = Math.floor(options.calendars/2), date, data, dow, month, cnt = 0, week, days, indic, indic2, html, tblCal;
				cal.find('td>table tbody').remove();
				for (var i = 0; i < options.calendars; i++) {
					date = new Date(options.current);
					date.addMonths(-currentCal + i);
					tblCal = cal.find('table').eq(i+1);
					switch (tblCal[0].className) {
						case 'datepickerViewDays':
							dow = formatDate(date, 'B, Y');
							break;
						case 'datepickerViewMonths':
							dow = date.getFullYear();
							break;
						case 'datepickerViewYears':
							dow = (date.getFullYear()-6) + ' - ' + (date.getFullYear()+5);
							break;
					} 
					tblCal.find('thead tr:first th:eq(1) span').text(dow);
					dow = date.getFullYear()-6;
					data = {
						data: [],
						className: 'datepickerYears'
					}
					for ( var j = 0; j < 12; j++) {
						data.data.push(dow + j);
					}
					html = tmpl(tpl.months.join(''), data);
					date.setDate(1);
					data = {weeks:[], test: 10};
					month = date.getMonth();
					var dow = (date.getDay() - options.starts) % 7;
					date.addDays(-(dow + (dow < 0 ? 7 : 0)));
					week = -1;
					cnt = 0;
					while (cnt < 42) {
						indic = parseInt(cnt/7,10);
						indic2 = cnt%7;
						if (!data.weeks[indic]) {
							week = date.getWeekNumber();
							data.weeks[indic] = {
								week: week,
								days: []
							};
						}
						data.weeks[indic].days[indic2] = {
							text: date.getDate(),
							classname: []
						};
						if (month != date.getMonth()) {
							data.weeks[indic].days[indic2].classname.push('datepickerNotInMonth');
						}
						if (date.getDay() == 0) {
							data.weeks[indic].days[indic2].classname.push('datepickerSunday');
						}
						if (date.getDay() == 6) {
							data.weeks[indic].days[indic2].classname.push('datepickerSaturday');
						}
						var fromUser = options.onRender(date);
						var val = date.valueOf();
						if (fromUser.selected || options.date == val || $.inArray(val, options.date) > -1 || (options.mode == 'range' && val >= options.date[0] && val <= options.date[1])) {
							data.weeks[indic].days[indic2].classname.push('datepickerSelected');
						}
						if (fromUser.disabled) {
							data.weeks[indic].days[indic2].classname.push('datepickerDisabled');
						}
						if (fromUser.className) {
							data.weeks[indic].days[indic2].classname.push(fromUser.className);
						}
						data.weeks[indic].days[indic2].classname = data.weeks[indic].days[indic2].classname.join(' ');
						cnt++;
						date.addDays(1);
					}
					html = tmpl(tpl.days.join(''), data) + html;
					data = {
						data: options.locale.monthsShort,
						className: 'datepickerMonths'
					};
					html = tmpl(tpl.months.join(''), data) + html;
					tblCal.append(html);
				}
			},
			parseDate = function (date, format) {
				if (date.constructor == Date) {
					return new Date(date);
				}
				var parts = date.split(/\W+/);
				var against = format.split(/\W+/), d, m, y, h, min, now = new Date();
				for (var i = 0; i < parts.length; i++) {
					switch (against[i]) {
						case 'd':
						case 'e':
							d = parseInt(parts[i],10);
							break;
						case 'm':
							m = parseInt(parts[i], 10)-1;
							break;
						case 'Y':
						case 'y':
							y = parseInt(parts[i], 10);
							y += y > 100 ? 0 : (y < 29 ? 2000 : 1900);
							break;
						case 'H':
						case 'I':
						case 'k':
						case 'l':
							h = parseInt(parts[i], 10);
							break;
						case 'P':
						case 'p':
							if (/pm/i.test(parts[i]) && h < 12) {
								h += 12;
							} else if (/am/i.test(parts[i]) && h >= 12) {
								h -= 12;
							}
							break;
						case 'M':
							min = parseInt(parts[i], 10);
							break;
					}
				}
				return new Date(
					y === undefined ? now.getFullYear() : y,
					m === undefined ? now.getMonth() : m,
					d === undefined ? now.getDate() : d,
					h === undefined ? now.getHours() : h,
					min === undefined ? now.getMinutes() : min,
					0
				);
			},
			formatDate = function(date, format) {
				var m = date.getMonth();
				var d = date.getDate();
				var y = date.getFullYear();
				var wn = date.getWeekNumber();
				var w = date.getDay();
				var s = {};
				var hr = date.getHours();
				var pm = (hr >= 12);
				var ir = (pm) ? (hr - 12) : hr;
				var dy = date.getDayOfYear();
				if (ir == 0) {
					ir = 12;
				}
				var min = date.getMinutes();
				var sec = date.getSeconds();
				var parts = format.split(''), part;
				for ( var i = 0; i < parts.length; i++ ) {
					part = parts[i];
					switch (parts[i]) {
						case 'a':
							part = date.getDayName();
							break;
						case 'A':
							part = date.getDayName(true);
							break;
						case 'b':
							part = date.getMonthName();
							break;
						case 'B':
							part = date.getMonthName(true);
							break;
						case 'C':
							part = 1 + Math.floor(y / 100);
							break;
						case 'd':
							part = (d < 10) ? ("0" + d) : d;
							break;
						case 'e':
							part = d;
							break;
						case 'H':
							part = (hr < 10) ? ("0" + hr) : hr;
							break;
						case 'I':
							part = (ir < 10) ? ("0" + ir) : ir;
							break;
						case 'j':
							part = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy;
							break;
						case 'k':
							part = hr;
							break;
						case 'l':
							part = ir;
							break;
						case 'm':
							part = (m < 9) ? ("0" + (1+m)) : (1+m);
							break;
						case 'M':
							part = (min < 10) ? ("0" + min) : min;
							break;
						case 'p':
						case 'P':
							part = pm ? "PM" : "AM";
							break;
						case 's':
							part = Math.floor(date.getTime() / 1000);
							break;
						case 'S':
							part = (sec < 10) ? ("0" + sec) : sec;
							break;
						case 'u':
							part = w + 1;
							break;
						case 'w':
							part = w;
							break;
						case 'y':
							part = ('' + y).substr(2, 2);
							break;
						case 'Y':
							part = y;
							break;
					}
					parts[i] = part;
				}
				return parts.join('');
			},
			extendDate = function(options) {
				if (Date.prototype.tempDate) {
					return;
				}
				Date.prototype.tempDate = null;
				Date.prototype.months = options.months;
				Date.prototype.monthsShort = options.monthsShort;
				Date.prototype.days = options.days;
				Date.prototype.daysShort = options.daysShort;
				Date.prototype.getMonthName = function(fullName) {
					return this[fullName ? 'months' : 'monthsShort'][this.getMonth()];
				};
				Date.prototype.getDayName = function(fullName) {
					return this[fullName ? 'days' : 'daysShort'][this.getDay()];
				};
				Date.prototype.addDays = function (n) {
					this.setDate(this.getDate() + n);
					this.tempDate = this.getDate();
				};
				Date.prototype.addMonths = function (n) {
					if (this.tempDate == null) {
						this.tempDate = this.getDate();
					}
					this.setDate(1);
					this.setMonth(this.getMonth() + n);
					this.setDate(Math.min(this.tempDate, this.getMaxDays()));
				};
				Date.prototype.addYears = function (n) {
					if (this.tempDate == null) {
						this.tempDate = this.getDate();
					}
					this.setDate(1);
					this.setFullYear(this.getFullYear() + n);
					this.setDate(Math.min(this.tempDate, this.getMaxDays()));
				};
				Date.prototype.getMaxDays = function() {
					var tmpDate = new Date(Date.parse(this)),
						d = 28, m;
					m = tmpDate.getMonth();
					d = 28;
					while (tmpDate.getMonth() == m) {
						d ++;
						tmpDate.setDate(d);
					}
					return d - 1;
				};
				Date.prototype.getFirstDay = function() {
					var tmpDate = new Date(Date.parse(this));
					tmpDate.setDate(1);
					return tmpDate.getDay();
				};
				Date.prototype.getWeekNumber = function() {
					var tempDate = new Date(this);
					tempDate.setDate(tempDate.getDate() - (tempDate.getDay() + 6) % 7 + 3);
					var dms = tempDate.valueOf();
					tempDate.setMonth(0);
					tempDate.setDate(4);
					return Math.round((dms - tempDate.valueOf()) / (604800000)) + 1;
				};
				Date.prototype.getDayOfYear = function() {
					var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
					var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
					var time = now - then;
					return Math.floor(time / 24*60*60*1000);
				};
			},
			layout = function (el) {
				var options = $(el).data('datepicker');
				var cal = $('#' + options.id);
				if (!options.extraHeight) {
					var divs = $(el).find('div');
					options.extraHeight = divs.get(0).offsetHeight + divs.get(1).offsetHeight;
					options.extraWidth = divs.get(2).offsetWidth + divs.get(3).offsetWidth;
				}
				var tbl = cal.find('table:first').get(0);
				var width = tbl.offsetWidth;
				var height = tbl.offsetHeight;
				cal.css({
					width: width + options.extraWidth + 'px',
					height: height + options.extraHeight + 'px'
				}).find('div.datepickerContainer').css({
					width: width + 'px',
					height: height + 'px'
				});
			},
			click = function(ev) {
				if ($(ev.target).is('span')) {
					ev.target = ev.target.parentNode;
				}
				var el = $(ev.target);
				if (el.is('a')) {
					ev.target.blur();
					if (el.hasClass('datepickerDisabled')) {
						return false;
					}
					var options = $(this).data('datepicker');
					var parentEl = el.parent();
					var tblEl = parentEl.parent().parent().parent();
					var tblIndex = $('table', this).index(tblEl.get(0)) - 1;
					var tmp = new Date(options.current);
					var changed = false;
					var fillIt = false;
					if (parentEl.is('th')) {
						if (parentEl.hasClass('datepickerWeek') && options.mode == 'range' && !parentEl.next().hasClass('datepickerDisabled')) {
							var val = parseInt(parentEl.next().text(), 10);
							tmp.addMonths(tblIndex - Math.floor(options.calendars/2));
							if (parentEl.next().hasClass('datepickerNotInMonth')) {
								tmp.addMonths(val > 15 ? -1 : 1);
							}
							tmp.setDate(val);
							options.date[0] = (tmp.setHours(0,0,0,0)).valueOf();
							tmp.setHours(23,59,59,0);
							tmp.addDays(6);
							options.date[1] = tmp.valueOf();
							fillIt = true;
							changed = true;
							options.lastSel = false;
						} else if (parentEl.hasClass('datepickerMonth')) {
							tmp.addMonths(tblIndex - Math.floor(options.calendars/2));
							switch (tblEl.get(0).className) {
								case 'datepickerViewDays':
									tblEl.get(0).className = 'datepickerViewMonths';
									el.find('span').text(tmp.getFullYear());
									break;
								case 'datepickerViewMonths':
									tblEl.get(0).className = 'datepickerViewYears';
									el.find('span').text((tmp.getFullYear()-6) + ' - ' + (tmp.getFullYear()+5));
									break;
								case 'datepickerViewYears':
									tblEl.get(0).className = 'datepickerViewDays';
									el.find('span').text(formatDate(tmp, 'B, Y'));
									break;
							}
						} else if (parentEl.parent().parent().is('thead')) {
							switch (tblEl.get(0).className) {
								case 'datepickerViewDays':
									options.current.addMonths(parentEl.hasClass('datepickerGoPrev') ? -1 : 1);
									break;
								case 'datepickerViewMonths':
									options.current.addYears(parentEl.hasClass('datepickerGoPrev') ? -1 : 1);
									break;
								case 'datepickerViewYears':
									options.current.addYears(parentEl.hasClass('datepickerGoPrev') ? -12 : 12);
									break;
							}
							fillIt = true;
						}
					} else if (parentEl.is('td') && !parentEl.hasClass('datepickerDisabled')) {
						switch (tblEl.get(0).className) {
							case 'datepickerViewMonths':
								options.current.setMonth(tblEl.find('tbody.datepickerMonths td').index(parentEl));
								options.current.setFullYear(parseInt(tblEl.find('thead th.datepickerMonth span').text(), 10));
								options.current.addMonths(Math.floor(options.calendars/2) - tblIndex);
								tblEl.get(0).className = 'datepickerViewDays';
								break;
							case 'datepickerViewYears':
								options.current.setFullYear(parseInt(el.text(), 10));
								tblEl.get(0).className = 'datepickerViewMonths';
								break;
							default:
								var val = parseInt(el.text(), 10);
								tmp.addMonths(tblIndex - Math.floor(options.calendars/2));
								if (parentEl.hasClass('datepickerNotInMonth')) {
									tmp.addMonths(val > 15 ? -1 : 1);
								}
								tmp.setDate(val);
								switch (options.mode) {
									case 'multiple':
										val = (tmp.setHours(0,0,0,0)).valueOf();
										if ($.inArray(val, options.date) > -1) {
											$.each(options.date, function(nr, dat){
												if (dat == val) {
													options.date.splice(nr,1);
													return false;
												}
											});
										} else {
											options.date.push(val);
										}
										break;
									case 'range':
										if (!options.lastSel) {
											options.date[0] = (tmp.setHours(0,0,0,0)).valueOf();
										}
										val = (tmp.setHours(23,59,59,0)).valueOf();
										if (val < options.date[0]) {
											options.date[1] = options.date[0] + 86399000;
											options.date[0] = val - 86399000;
										} else {
											options.date[1] = val;
										}
										options.lastSel = !options.lastSel;
										break;
									default:
										options.date = tmp.valueOf();
										break;
								}
								break;
						}
						fillIt = true;
						changed = true;
					}
					if (fillIt) {
						fill(this);
					}
					if (changed) {
						options.onChange.apply(this, prepareDate(options));
					}
				}
				return false;
			},
			prepareDate = function (options) {
				var tmp;
				if (options.mode == 'single') {
					tmp = new Date(options.date);
					return [formatDate(tmp, options.format), tmp, options.el];
				} else {
					tmp = [[],[], options.el];
					$.each(options.date, function(nr, val){
						var date = new Date(val);
						tmp[0].push(formatDate(date, options.format));
						tmp[1].push(date);
					});
					return tmp;
				}
			},
			getViewport = function () {
				var m = document.compatMode == 'CSS1Compat';
				return {
					l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
					t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
					w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
					h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
				};
			},
			isChildOf = function(parentEl, el, container) {
				if (parentEl == el) {
					return true;
				}
				if (parentEl.contains) {
					return parentEl.contains(el);
				}
				if ( parentEl.compareDocumentPosition ) {
					return !!(parentEl.compareDocumentPosition(el) & 16);
				}
				var prEl = el.parentNode;
				while(prEl && prEl != container) {
					if (prEl == parentEl)
						return true;
					prEl = prEl.parentNode;
				}
				return false;
			},
			show = function (ev) {
				var cal = $('#' + $(this).data('datepickerId'));
				if (!cal.is(':visible')) {
					var calEl = cal.get(0);
					fill(calEl);
					var options = cal.data('datepicker');
					options.onBeforeShow.apply(this, [cal.get(0)]);
					var pos = $(this).offset();
					var viewPort = getViewport();
					var top = pos.top;
					var left = pos.left;
					var oldDisplay = $.curCSS(calEl, 'display');
					cal.css({
						visibility: 'hidden',
						display: 'block'
					});
					layout(calEl);
					switch (options.position){
						case 'top':
							top -= calEl.offsetHeight;
							break;
						case 'left':
							left -= calEl.offsetWidth;
							break;
						case 'right':
							left += this.offsetWidth;
							break;
						case 'bottom':
							top += this.offsetHeight;
							break;
					}
					if (top + calEl.offsetHeight > viewPort.t + viewPort.h) {
						top = pos.top  - calEl.offsetHeight;
					}
					if (top < viewPort.t) {
						top = pos.top + this.offsetHeight + calEl.offsetHeight;
					}
					if (left + calEl.offsetWidth > viewPort.l + viewPort.w) {
						left = pos.left - calEl.offsetWidth;
					}
					if (left < viewPort.l) {
						left = pos.left + this.offsetWidth
					}
					cal.css({
						visibility: 'visible',
						display: 'block',
						top: top + 'px',
						left: left + 'px'
					});
					if (options.onShow.apply(this, [cal.get(0)]) != false) {
						cal.show();
					}
					$(document).bind('mousedown', {cal: cal, trigger: this}, hide);
				}
				return false;
			},
			hide = function (ev) {
				if (ev.target != ev.data.trigger && !isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
					if (ev.data.cal.data('datepicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
						ev.data.cal.hide();
					}
					$(document).unbind('mousedown', hide);
				}
			};
		return {
			init: function(options){
				options = $.extend({}, defaults, options||{});
				extendDate(options.locale);
				options.calendars = Math.max(1, parseInt(options.calendars,10)||1);
				options.mode = /single|multiple|range/.test(options.mode) ? options.mode : 'single';
				return this.each(function(){
					if (!$(this).data('datepicker')) {
						options.el = this;
						if (options.date.constructor == String) {
							options.date = parseDate(options.date, options.format);
							options.date.setHours(0,0,0,0);
						}
						if (options.mode != 'single') {
							if (options.date.constructor != Array) {
								options.date = [options.date.valueOf()];
								if (options.mode == 'range') {
									options.date.push(((new Date(options.date[0])).setHours(23,59,59,0)).valueOf());
								}
							} else {
								for (var i = 0; i < options.date.length; i++) {
									options.date[i] = (parseDate(options.date[i], options.format).setHours(0,0,0,0)).valueOf();
								}
								if (options.mode == 'range') {
									options.date[1] = ((new Date(options.date[1])).setHours(23,59,59,0)).valueOf();
								}
							}
						} else {
							options.date = options.date.valueOf();
						}
						if (!options.current) {
							options.current = new Date();
						} else {
							options.current = parseDate(options.current, options.format);
						} 
						options.current.setDate(1);
						options.current.setHours(0,0,0,0);
						var id = 'datepicker_' + parseInt(Math.random() * 1000), cnt;
						options.id = id;
						$(this).data('datepickerId', options.id);
						var cal = $(tpl.wrapper).attr('id', id).bind('click', click).data('datepicker', options);
						if (options.className) {
							cal.addClass(options.className);
						}
						var html = '';
						for (var i = 0; i < options.calendars; i++) {
							cnt = options.starts;
							if (i > 0) {
								html += tpl.space;
							}
							html += tmpl(tpl.head.join(''), {
									week: options.locale.weekMin,
									prev: options.prev,
									next: options.next,
									day1: options.locale.daysMin[(cnt++)%7],
									day2: options.locale.daysMin[(cnt++)%7],
									day3: options.locale.daysMin[(cnt++)%7],
									day4: options.locale.daysMin[(cnt++)%7],
									day5: options.locale.daysMin[(cnt++)%7],
									day6: options.locale.daysMin[(cnt++)%7],
									day7: options.locale.daysMin[(cnt++)%7]
								});
						}
						cal
							.find('tr:first').append(html)
								.find('table').addClass(views[options.view]);
						fill(cal.get(0));
						if (options.flat) {
							cal.appendTo(this).show().css('position', 'relative');
							layout(cal.get(0));
						} else {
							cal.appendTo(document.body);
							$(this).bind(options.eventName, show);
						}
					}
				});
			},
			showPicker: function() {
				return this.each( function () {
					if ($(this).data('datepickerId')) {
						show.apply(this);
					}
				});
			},
			hidePicker: function() {
				return this.each( function () {
					if ($(this).data('datepickerId')) {
						$('#' + $(this).data('datepickerId')).hide();
					}
				});
			},
			setDate: function(date, shiftTo){
				return this.each(function(){
					if ($(this).data('datepickerId')) {
						var cal = $('#' + $(this).data('datepickerId'));
						var options = cal.data('datepicker');
						options.date = date;
						if (options.date.constructor == String) {
							options.date = parseDate(options.date, options.format);
							options.date.setHours(0,0,0,0);
						}
						if (options.mode != 'single') {
							if (options.date.constructor != Array) {
								options.date = [options.date.valueOf()];
								if (options.mode == 'range') {
									options.date.push(((new Date(options.date[0])).setHours(23,59,59,0)).valueOf());
								}
							} else {
								for (var i = 0; i < options.date.length; i++) {
									options.date[i] = (parseDate(options.date[i], options.format).setHours(0,0,0,0)).valueOf();
								}
								if (options.mode == 'range') {
									options.date[1] = ((new Date(options.date[1])).setHours(23,59,59,0)).valueOf();
								}
							}
						} else {
							options.date = options.date.valueOf();
						}
						if (shiftTo) {
							options.current = new Date (options.mode != 'single' ? options.date[0] : options.date);
						}
						fill(cal.get(0));
					}
				});
			},
			getDate: function(formated) {
				if (this.size() > 0) {
					return prepareDate($('#' + $(this).data('datepickerId')).data('datepicker'))[formated ? 0 : 1];
				}
			},
			clear: function(){
				return this.each(function(){
					if ($(this).data('datepickerId')) {
						var cal = $('#' + $(this).data('datepickerId'));
						var options = cal.data('datepicker');
						if (options.mode != 'single') {
							options.date = [];
							fill(cal.get(0));
						}
					}
				});
			},
			fixLayout: function(){
				return this.each(function(){
					if ($(this).data('datepickerId')) {
						var cal = $('#' + $(this).data('datepickerId'));
						var options = cal.data('datepicker');
						if (options.flat) {
							layout(cal.get(0));
						}
					}
				});
			}
		};
	}();
	$.fn.extend({
		DatePicker: DatePicker.init,
		DatePickerHide: DatePicker.hidePicker,
		DatePickerShow: DatePicker.showPicker,
		DatePickerSetDate: DatePicker.setDate,
		DatePickerGetDate: DatePicker.getDate,
		DatePickerClear: DatePicker.clear,
		DatePickerLayout: DatePicker.fixLayout
	});
})(jQuery);

(function(){
  var cache = {};
 
  this.tmpl = function tmpl(str, data){
    // Figure out if we're getting a template, or if we need to
    // load the template - and be sure to cache the result.
    var fn = !/\W/.test(str) ?
      cache[str] = cache[str] ||
        tmpl(document.getElementById(str).innerHTML) :
     
      // Generate a reusable function that will serve as a template
      // generator (and which will be cached).
      new Function("obj",
        "var p=[],print=function(){p.push.apply(p,arguments);};" +
       
        // Introduce the data as local variables using with(){}
        "with(obj){p.push('" +
       
        // Convert the template into pure JavaScript
        str
          .replace(/[\r\t\n]/g, " ")
          .split("<%").join("\t")
          .replace(/((^|%>)[^\t]*)'/g, "$1\r")
          .replace(/\t=(.*?)%>/g, "',$1,'")
          .split("\t").join("');")
          .split("%>").join("p.push('")
          .split("\r").join("\\'")
      + "');}return p.join('');");
   
    // Provide some basic currying to the user
    return data ? fn( data ) : fn;
  };
})();
/* 
*
* WF front-end framework 1.0
*
* Copyright (c) 2010 Jonas Lim
* http://wf.wafast.com
* 
* built to be used with jQuery library
* http://jquery.com
* 
* update: May 10rd 2010
* 
*/
(function($)
{
	var WF = function()
	{
		
	};
	this.bodyObj = $(window.parent.document).find("body");
	this.overlay = $('<div id="overlay"></div>');
	this.popupObj = $('<div id="popup"></div>');
	this.textObj = $('<div class="text"></div>')
	this.titleObj = $('<div class="title"></div>');
	this.iframeObj = $('<iframe frameborder="0" allowtransparency="true"></iframe>');
	this.imgObj = $('<img />');
	this.tooltipObj = $('<div class="tooltipContent"></div>');
	
	function removePopup()
	{
		overlay.remove();
		popupObj.remove();
		popupObj.empty();
		iframeObj.remove();
		imgObj.remove();
		titleObj.empty(); 
		titleObj.remove();
		textObj.remove();
		textObj.empty();
	}
	function createPopupByUrl(url, w, h, t)
	{
		if(bodyObj.attr("scrollWidth") == undefined)
		{
			bodyObj = $(document).find("body");
		}
		iframeObj.attr("src", url);
		if(w != undefined)
		{
			iframeObj.css("width", w);
		}
		else
		{
			iframeObj.css("width", $(window).width() * 0.8);
		}
		if(h != undefined)
		{
			iframeObj.css("height", h);
		}
		else
		{
			iframeObj.css("height", $(window).height() * 0.8);
		}
		
		popupObj.css("left", (bodyObj.attr("scrollWidth") - iframeObj.css("width").substr(0, iframeObj.css("width").indexOf("px"))) / 2);
		popupObj.css("top", iframeObj.css("height").substr(0, iframeObj.css("height").indexOf("px")) > $(document).height() ? 20 : $(document).scrollTop() + ( $(window).height() - iframeObj.css("height").substr(0, iframeObj.css("height").indexOf("px"))) / 2);
		titleObj.append(t);
		popupObj.append(titleObj);
		popupObj.append(iframeObj);
		bodyObj.append(overlay);
		bodyObj.append(popupObj);
		
		overlay.css("width", $(document).width());
		overlay.css("height", $(document).height());
		overlay.bind("click", removePopup);
	}
	function createPopupByImgUrl(url, w, h, t)
	{
		
		if(bodyObj.attr("scrollWidth") == undefined)
		{
			bodyObj = $(document).find("body");
		}
		
		imgObj.attr("src", url);
		var s = imgObj.attr("width") / imgObj.attr("height");
		alert(imgObj.attr("width"));
		if(w != undefined)
		{
			imgObj.attr("width", w);
		}
		else
		{
			imgObj.attr("width", (imgObj.attr("width") > $(window).width() * 0.8 ? $(window).width() * 0.8 : imgObj.attr("width")));
		}
		if(h != undefined)
		{
			imgObj.attr("height", h);
		}
		else
		{
			imgObj.attr("height", imgObj.attr("width") / s);
		}
		popupObj.css("left", (bodyObj.attr("scrollWidth") - imgObj.attr("width")) / 2);
		popupObj.css("top", imgObj.attr("height") > bodyObj.height() ? 20 : $(document).scrollTop() + ($(window).height() - imgObj.attr("height")) / 2);
		titleObj.append(t);
		popupObj.append(titleObj);
		popupObj.append(imgObj);
		bodyObj.append(overlay);
		bodyObj.append(popupObj);
		overlay.css("width", $(document).width());
		overlay.css("height", $(document).height());
		overlay.bind("click", removePopup);
	}
	function createPopupByText(text, w, h, t, canClose)
	{
		if(bodyObj.attr("scrollWidth") == undefined)
		{
			bodyObj = $(document).find("body");
		}
		if(w != undefined)
		{
			textObj.attr("width", w);
			textObj.css("width", w);
		}
		else
		{
			textObj.attr("width", 200);
			textObj.css("width", 200);
		}
		if(h != undefined)
		{
			textObj.attr("height", h);
			textObj.css("height", h);
		}
		else
		{
			textObj.attr("height", 100);
			textObj.css("height", 100);
		}
		popupObj.css("left", (bodyObj.attr("scrollWidth") - textObj.attr("width")) / 2);
		popupObj.css("top", textObj.attr("height") > $(document).height() ? 20 : $(document).scrollTop() + ($(window).height() - textObj.attr("height")) / 2);
		titleObj.append(t);
		textObj.append("<p>" + text + "</p>");
		popupObj.append(titleObj);
		popupObj.append(textObj);
		bodyObj.append(overlay);
		bodyObj.append(popupObj);
		overlay.css("width", $(document).width());
		overlay.css("height", $(document).height());
		if(canClose != 0)
			overlay.bind("click", removePopup);
	}
	
	
	WF.prototype = {
		/*
		* Setup all the Png images background transparent.
		*/
		TransparentPNG: function()
		{
			var arVersion = navigator.appVersion.split("MSIE") 
			var version = parseFloat(arVersion[1]) 
			if ((version >= 5.5) && (document.body.filters)) 
			{
			   for(var j=0; j<document.images.length; j++) 
			   {
				  var img = document.images[j] 
				  var imgName = img.src.toUpperCase() 
				  if (imgName.substring(imgName.length-3, imgName.length) == "PNG") 
				  { 
					 var imgID = (img.id) ? "id='" + img.id + "' " : "" 
					 var imgClass = (img.className) ? "class='" + img.className + "' " : "" 
					 var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' " 
					 var imgStyle = img.style.cssText;
					 if (img.align == "left") imgStyle = "float:left;" + imgStyle;
					 if (img.align == "right") imgStyle = "float:right;" + imgStyle;
					 if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle;
					 var strNewHTML = "<span " + imgID + imgClass + imgTitle 
					 + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";" 
					 + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader" 
					 + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>";
					 img.outerHTML = strNewHTML;
					 j = j-1;
				  } 
			   } 
			}
		},
		/*
		* Setup all the id as "nav" element.
		*/
		Navigation: function(obj, index)
		{
			function initNav(nav)
			{
				nav.data("selectedIndex",-1);
				nav.bind("refresh", function (event, n, index){
					n.children("ul").children("li").each(function(k){
						$(this).children().removeClass();
						if(k == index)
						{
							$(this).children().addClass("active");
						}
					});
				});
				nav.children("ul").children("li").each(function(j){
					$(this).children().click(function(){
						nav.data("selectedIndex", j);
						nav.trigger("refresh", [nav,j]); 
					});	
					if($(this).children("ul").length > 0)
					{
						var li = $(this);
						li.children("ul").each(function(k){
							$(this).hide();
						});
						li.mouseover(function(){
							$(this).children("ul").each(function(k){
								$(this).show();
							});
						});
						li.mouseout(function(){
							$(this).children("ul").each(function(k){
								$(this).hide();
							});
						});
					}
				});
			}
			if(obj != null)
			{
				initNav(obj);
			}
			else
			{
				$(".nav").each(function(i){
					initNav($(this));
				});
			}
		},
		
		AutoResize: function()
		{
			var getPadding = function(jqobj)
			{
				var pdtstr = jqobj.css("paddingTop");
				var pdbstr = jqobj.css("paddingBottom");
				var pd = 0;
				if(pdtstr.indexOf("px") != -1)
				{
					pd += parseInt(pdtstr.substring(0, pdtstr.indexOf("px")));
				}
				else if(pdtstr.indexOf("em") != -1)
				{
					pd += parseInt(pdtstr.substring(0, pdtstr.indexOf("em")));
				}
				if(pdbstr.indexOf("px") != -1)
				{
					pd += parseInt(pdbstr.substring(0, pdbstr.indexOf("px")));
				}
				else if(pdbstr.indexOf("em") != -1)
				{
					pd += parseInt(pdbstr.substring(0, pdbstr.indexOf("em")));
				}
				return pd;
			}
			$(window).resize(function(){
				var h = $(window).height();
				if($("#header") != null)
				{
					h -= $("#header").height();
					h -= getPadding($("#header"))
				}
				if($("#footer") != null)
				{
					h -= $("#footer").height();
					h -= getPadding($("#footer"));
				}
				if($("#main") != null)
				{
					$("#main").height(h);
				}
				if($("#side") != null)
				{
					$("#side").height(h);
				}
			});
			if($(".iframe").length > 0)
			{
				$(".iframe").each(function(i){
					$(this).css("height", $(this).contents().find("body").attr("scrollHeight"));
					$(this).load(function(){
						$(this).css("height", $(this).contents().find("body").attr("scrollHeight"));
					});
				});
			}
			if($("#side") != null)
			{
				$("#side").data("pwidth",$("#side").width());
				$("#side").dblclick(function(){
					$("#main").animate({marginLeft:'10px'},"fast");
					$("#side").animate({width: '0px'}, "fast", "swing", function(){
						$("#side").hide();
						$(document).dblclick(function(e){
							if(e.pageX < 10)
							{
								$("#main").animate({marginLeft:$("#side").data("pwidth") + 10},"fast");
								$("#side").animate({width:$("#side").data("pwidth")},"fast");
								$(document).unbind("dblclick");
							}
						});
					});
				});
			}
			$(window).trigger("resize");
			$("body").css("overflow", "hidden");
		},
		Pagination: function()
		{
			$(".pagination").each(function(){
										  
				var attrObj = eval("({" + $(this).attr("rel") + "})");
				if(attrObj.cp <= attrObj.tp)
				{
					var html = "";
					var i = attrObj.cp - 5 > 1 ? attrObj.cp - 5 : 1;
					if(attrObj.cp > 6)
					{
						html += "<span onclick='" + attrObj.fun + "({page:" + (i - 1) +"})'>...</span>";
					}
					while(i < attrObj.cp)
					{
						html += "<span class='num' onclick='" + attrObj.fun + "({page:" + i +"})'>" + i + "</span>";
						i++;
					}
					html += "<span class='active'>" + attrObj.cp + "</span>";
					i = attrObj.cp + 1;
					while(i <= attrObj.tp && i < attrObj.cp + 6)
					{
						html += "<span class='num' onclick='" + attrObj.fun + "({page:" + i +"})'>" + i + "</span>";
						i++;
					}
					if(i <= attrObj.tp)
					{
						html += "<span onclick='" + attrObj.fun + "({page:" + i +"})'>...</span>";
					}
					if(attrObj.tp > attrObj.cp + 8)
					{
						i = attrObj.tp - 2;
						while(i <= attrObj.tp)
						{
							html += "<span class='num' onclick='" + attrObj.fun + "({page:" + i +"})'>" + i + "</span>";
							i++;
						}
					}
					//html += "<input type='text' class='txtPage' /><button class='btnPage' >GO</button>";
					$(this).empty(); 
					$(this).append(html);
					var txt = $("<input type='text' class='txtPage' />");
					txt.appendTo($(this));
					var btn = $("<button class='btnPage' >GO</button>");
					btn.appendTo($(this));
					btn.bind("click", function(){
						if(txt.val() != "")
							eval(attrObj.fun + "({page:" + txt.val() + "})");
					});
				}
				else
				{
					alert("the cp > tp in Pagination");
				}
			});
		},
		UrlRequest: function()
		{
			$("a").each(function(i){
				var id = $(this).attr("target");
				if(id != null && id != "" && $("#" + id).attr("id") != undefined)
				{
					var url = $(this).attr("href");
					$(this).attr("href", "javascript:void(0)");
					$(this).attr("target", "");
					$(this).bind("click", function(){
						var obj = $("#" + id);
						if(obj.length == 0)
						{
							obj = $(window.parent.document).find("#" + id);
							if(obj.length == 0)
							{
								return;
							}
						}
						if(obj.get(0).tagName == "IFRAME")
						{
							obj.unbind("load");
							obj.attr("src", url);
							obj.load(function(){
								obj.css("height", obj.contents().find("body").attr("scrollHeight"));
							});
						}
						else
						{
							obj.load(url, function(){
								if(obj.attr("class").indexOf("nav") != -1)
								{
									$.wf.Navigation(obj);
								}
							});
						}
					});
				}
			});
		},
		Alert: function(text, title, w, h, canClose)
		{
			createPopupByText(text, w, h, title, canClose);
		},
		Popup: function()
		{
			$("a").filter(".popup").each(function(i){
				var url = $(this).attr("href");
				var attrObj = eval("({" + $(this).attr("rel") + "})");
				$(this).attr("href", "javascript:void(0)");
				if($(this).attr("class").indexOf("url") != -1)
				{
					$(this).bind("click", function(){
						createPopupByUrl(url, attrObj.width, attrObj.height, $(this).attr("title"));
					});
				}
				else
				{
					$(this).bind("click", function(){
						createPopupByImgUrl(url, attrObj.width, attrObj.height, $(this).attr("title"));
					});
				}
			});
		},
		RemovePopup: function()
		{
			removePopup();
		},
		TabNavigator: function()
		{
			$(".tabNavigator").each(function(){
				$(this).data("itemClick", "");
				$(this).data("selectedIndex", 0);
				if($(this).attr("rel") != undefined)
				{
					var attrObj = eval("({" + $(this).attr("rel") + "})");
					$(this).data("itemClick", attrObj.itemClick);
				}
				
				var ul = $('<ul class="tabNavigatorTabs">');
				var tabNav = $(this);
				tabNav.children().each(function(i){
					var target = $(this);
					if(target.attr("rel") != undefined)
					{
						var targetAttrObj = eval("({" + target.attr("rel") + "})");
						if(targetAttrObj.icon != undefined)
						{
							var li = $('<li><img src="' + targetAttrObj.icon + '" /></li>');
						}
						else if(targetAttrObj.title != undefined)
						{
							var li = $('<li>' + targetAttrObj.title + '</li>');
						}
					}
					else
					{
						var li = $('<li>' + target.attr("title") + '</li>');
					}
					li.data("target", target);
					li.data("index", i);
					li.bind("click", function(){
						var currli = $(this);
						if(tabNav.data("itemClick") != "")
						{
							if(!eval(tabNav.data("itemClick") + "({newIndex:" + currli.data("index") + ", oldIndex:" + tabNav.data("selectedIndex") + "})"))
							{
								return;
							}
						}
						currli.parent().children().each(function(i){
							$(this).attr("class", "");
							$(this).data("target").css("display", "none");
						});
						currli.attr("class", "active");
						currli.data("target").css("display", "");
						tabNav.data("selectedIndex", currli.data("index"));
					});
					
					ul.append(li);
					if(i != 0)
					{
						target.css("display", "none");
					}
					else
					{
						li.attr("class", "active");
					}
				});
				tabNav.prepend(ul);
			});
		},
		DateField: function()
		{
			$(".dateField=:text").each(function(i){
				var txt = $(this);
				var thisDate = new Date();
				if(txt.val() == null || txt.val() == "" || txt.val() == undefined)
				{
					txt.val(thisDate.getFullYear() + "-" + (thisDate.getMonth() + 1) + "-" + thisDate.getDate());
				}
				txt.DatePicker({
					format:'Y-m-d',
					date: txt.val(),
					current: txt.val(),
					starts: 0,
					position: 'r',
					onBeforeShow: function(){
						txt.DatePickerSetDate(txt.val(), true);
					},
					onChange: function(formated, dates){
						txt.val(formated);
					}
				});
			});
		},
		Panel: function()
		{
			$(".panel").each(function(i){
				var panelTitleObj = $('<div class="title"></div>');
				panelTitleObj.append($(this).attr("title"));
				$(this).attr("title", "");
				$(this).data("expand", true);
				$(this).prepend(panelTitleObj);
				$(this).dblclick(function(){
					if($(this).data("expand"))
					{
						$(this).animate({height:parseInt(panelTitleObj.css("height").substring(0, panelTitleObj.css("height").indexOf("px")))},"fast");
						$(this).children().each(function(i){
							if(i != 0)
								$(this).hide();
						});
						$(this).data("expand", false);
					}
					else
					{
						$(this).animate("fast");
						$(this).children().each(function(i){
							if(i != 0)
								$(this).show();
						});
						$(this).css("height", "auto");
						$(this).data("expand", true);
					}
				});
			});
		},
		Tooltip: function()
		{
			$(".tooltip").each(function(i){
				$(this).data("tooltipData", $(this).attr("title"));
				$(this).removeAttr("title");
				$(this).mousemove(function(e){
					if($(this).data("tooltipData") != "")
					{
						tooltipObj.empty();
						tooltipObj.html($(this).data("tooltipData"));
						if(e.pageX + 10 + tooltipObj.width() > $(this).parents("body").width())
						{
							tooltipObj.css("left", e.pageX - tooltipObj.width() - 10);
						}
						else
						{
							tooltipObj.css("left", e.pageX + 10);
						}
						tooltipObj.css("top", e.pageY);
						$(this).parents("body").append(tooltipObj);
					}
				})
				$(this).mouseout(function(e){
					tooltipObj.remove();
				})
			});
			
		},
		Tree: function()
		{
			$(".tree").each(function(i){
				var tree = $(this);
				tree.data("nodeClick", ""); //节点点击时回调的js方法名
				tree.data("defaultState", "");  //默认状态，参数为：‘open’或‘close’，不设置则是‘open’
				tree.data("isShowRoot", "");  //是否显示跟节点，参数为：'yes'或‘no’，不设置则是‘yes’
				if(tree.attr("rel") != undefined)
				{
					var attrObj = eval("({" + tree.attr("rel") + "})");
					tree.data("nodeClick", attrObj.nodeClick);
					tree.data("defaultState", attrObj.defaultState);
					tree.data("isShowRoot", attrObj.isShowRoot);
				}
				var isFirst = true;
				if(tree.data("isShowRoot") != "no" && tree.children("a").length == 0)
				{
					var rootNode = $("<a class='treeRootNode' href='javascript:void(0);'>" + $(this).attr("title") + "</a>");
					rootNode.data("isOpen", true);
					if(tree.data("defaultState") != "close")
					{
						rootNode.data("isOpen", true);
					}
					else
					{
						rootNode.data("isOpen", false);
						tree.children("ul").css("display", "none");
					}
					rootNode.bind("click", function(){
						if(rootNode.data("isOpen"))
						{
							tree.children("ul").css("display", "none");
							rootNode.data("isOpen", false);
						}
						else
						{
							tree.children("ul").css("display", "block");
							rootNode.data("isOpen", true);
							if(tree.data("nodeClick") != "")
							{
								var e = {};
								e.label = currentNode.children("a").text();
								e.type = "rootNode";
								e.item = currentNode.context;
								e.tree = tree.context;
								eval(tree.data("nodeClick") + "(e)");
							}
						}
					});
					tree.prepend(rootNode);
				}
				else
				{
					isFirst = false;
				}
				function parseNode(ulObj, treeObj)
				{
					ulObj.each(function(i){
						$(this).children("li").each(function(i){
							var currentNode = $(this);
							currentNode.removeClass();
							if(currentNode.children("ul").length > 0)
							{
								currentNode.addClass("treeParentNode");
								currentNode.addClass("treeOpenNode");
								if(currentNode.data("isOpen") == null)
								{
									if(treeObj.data("defaultState") != "close" || isFirst == false)
									{
										currentNode.data("isOpen", true);
									}
									else
									{
										currentNode.data("isOpen", false);
									}
								}
								if(currentNode.data("isOpen") == false)
								{
									currentNode.toggleClass("treeOpenNode");
									currentNode.children("ul").css("display", "none");
								}
								currentNode.children("a").removeAttr("href");
								currentNode.children("a").css("cursor", "pointer");
								currentNode.children("a").unbind("click");
								currentNode.children("a").bind("click", function(){
									if(currentNode.data("isOpen"))
									{
										currentNode.children("ul").css("display", "none");
										currentNode.data("isOpen", false);
									}
									else
									{
										currentNode.children("ul").css("display", "block");
										currentNode.data("isOpen", true);
										if(treeObj.data("nodeClick") != "")
										{
											var e = {};
											e.label = currentNode.children("a").text();
											e.type = "parentNode";
											e.item = currentNode.context;
											e.tree = treeObj.context;
											eval(treeObj.data("nodeClick") + "(e)");
										}
									}
									currentNode.toggleClass("treeOpenNode");
								});
								parseNode(currentNode.children("ul"), treeObj);
							}
							else
							{
								currentNode.addClass("treeChildNode");
								if(currentNode.children("a").attr("href") == undefined )
								{
									currentNode.children("a").css("cursor", "pointer");
									currentNode.children("a").unbind("click");
									currentNode.children("a").bind("click", function(){
										if(treeObj.data("nodeClick") != "")
										{
											var e = {};
											e.label = currentNode.children("a").text();
											e.type = "childNode";
											e.item = currentNode.context;
											e.tree = treeObj.context;
											eval(treeObj.data("nodeClick") + "(e)");
										}
									});
								}
							}
						});
					});
				}
				parseNode(tree.children("ul"), tree);
			});
		}
	}
	$.wf = new WF();
})(jQuery);